package com.tianji.aigc.config;

import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.cloud.nacos.annotation.NacosConfig;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import jakarta.annotation.PostConstruct;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicReference;

/**
 * 从 Nacos 配置中心动态加载和监听一个系统提示词（System Prompt）的配置，并将其安全地提供给应用程序的其他部分使用。
 */
@Slf4j
@Getter
@Configuration
@RequiredArgsConstructor
public class SystemPromptConfig {

    // 用于与 Nacos 配置中心进行交互，比如获取配置、监听配置变更等。
    private final NacosConfigManager nacosConfigManager;
    private final AIProperties aiProperties;

    // 使用原子引用，保证线程安全，底层是CAS（Compare-And-Swap）机制
    private final AtomicReference<String> chatSystemPrompt = new AtomicReference<>();
    private final AtomicReference<String> titleSystemPrompt = new AtomicReference<>();

    @PostConstruct
    public void init() {
        // 获取配置
        loadConfig(aiProperties.getSystem().getChat(), null, chatSystemPrompt);
        loadConfig(null, aiProperties.getSystem().getTitle(), titleSystemPrompt);
    }

    private void loadConfig(AIProperties.System. Chat chatConfig,
                            AIProperties.System.Title titleConfig,
                            AtomicReference<String> target) {
        try {

            String group, dataId;
            long timeoutMs;
            if (chatConfig != null) {
                group = chatConfig.getGroup();
                dataId = chatConfig.getDataId();
                timeoutMs = chatConfig.getTimeoutMs();
            } else {
                group = titleConfig.getGroup();
                dataId = titleConfig.getDataId();
                timeoutMs = titleConfig.getTimeoutMs();
            }


            // 1. 主动读取配置
            var config = nacosConfigManager.getConfigService().getConfig(dataId, group, timeoutMs);
            target.set(config);
            log.info("从Nacos配置中心加载配置成功：{}", config);
            // 2. 添加监听器，实现动态更新
            nacosConfigManager.getConfigService().addListener(dataId, group, new Listener() {
                @Override
                public Executor getExecutor() {
                    return null;// 使用 Nacos 客户端的默认线程池
                }

                @Override
                public void receiveConfigInfo(String s) {
                    target.set(s);
                    log.info("从Nacos配置中心动态更新配置成功：{}", s);
                }
            });
        } catch (NacosException e) {
            log.error("从Nacos配置中心加载配置失败！原因：{}", e.getMessage());
        }


    }

}
